package leetcode;

import java.util.HashSet;

/**
 * @创建人 mby381
 * @创建时间 2022/3/11
 * @描述
 */
public class Solution3 {
//    public static int lengthOfLongestSubstring(String s) {
//        if (s == null) {
//            return 0;
//        }else if(s.length()==1){
//            return 1;
//        }
//        HashSet<Character> li = new HashSet<Character>();
//        int max = 0;
//        int tag = 0;
//        int head =0;
//        int tail =0;
//        boolean endtag = false;
//        for(int p=0;p<s.length();p++){
//            li.add(s.charAt(p));
//            tag++;
//            tail++;
//            if(tag!= li.size()){
//                max=Math.max(max,li.size());
//                System.out.println("得到一个最大值");
//                for(int o=head;o<tail;o++){
//                    if(s.charAt(o)==s.charAt(p)){
//                        head=o+1;
//                        p=head-1;
//                        break;
//                    }
//                }
//            }
//            if(p==s.length()-1){
//                if(tag==li.size()){
//                    max= li.size();
//                }else{
//                    max=li.size()-1;
//                    System.out.println("蛤？");
//                }
//                break;
//            }
//        }
//        return max;
//    }
//    public static int LongestSubstring(String s) {
//        if (s == null) {
//            return 0;
//        }else if(s.length()==1){
//            return 1;
//        }
//        HashSet<Character> li = new HashSet<Character>();
//        int max = 0;
//        int tag = 0;
//        int head =0;
//        int tail =0;
//        boolean endtag = false;
//        for(int p=0;p<s.length();p++){
//            li.add(s.charAt(p));
//            tag++;
//            tail++;
//            if(tag!= li.size()){
//                max=Math.max(max,li.size());
//                System.out.println("得到一个最大值");
//                for(int o=head;o<tail;o++){
//                    if(s.charAt(o)==s.charAt(p)){
//                        head=o+1;
//                        p=head-1;
//                        break;
//                    }
//                }
//            }
//            if(p==s.length()-1){
//                if(tag==li.size()){
//                    max= li.size();
//                }else{
//                    max=li.size()-1;
//                    System.out.println("蛤？");
//                }
//                break;
//            }
//            return max;
//        }
//        for (int i = 0; i < s.length(); i++) {
//            for (int j = i; j < s.length(); j++) {
//                li.add(s.charAt(j));
//                tag = tag + 1;
//                System.out.println("池+1 ："+tag);
//                if (li.size() != tag) {
//                    if (li.size() > max) {
//                        max = li.size();
//                        System.out.println("获得一个后备最大值"+max);
//                    }
//                    System.out.println("一次j循环结束了");
//                    break;
//                }
//                if (j == s.length() - 1) {
//                    endtag = true;
//                    if (li.size()==tag) {
//                        if((li.size()+1)>max){
//                            max = li.size();
//                            System.out.println("到达末尾，值为"+(max));
//                        }
//
//                    }
//                    break;
//                }
//            }
//            if (endtag) {
//                System.out.println("末尾式结束了");
//                break;
//            }
//            li.clear();
//            tag = 0;
//        }
//        return max;
//    }


    public static int lengthOfLongestSubstring(String s) {
        if (s == null) {
            return 0;
        } else if (s.length() == 1) {
            return 1;
        }
        HashSet<Character> li = new HashSet<>();
//        HashSet<Character> l1 = new HashSet<>();
//        boolean a=li.equals(l1);
        int max = 0;
        int tag = 0;
        int head = 0;
        int tail = 0;
        for (int p = 0; p < s.length(); p++) {
            li.add(s.charAt(p));
            tag++;
            System.out.println("外" + (tail == p));
            if (tag != li.size()) {
                max = Math.max(max, li.size());
                System.out.println("最大值多一个");
                System.out.println(tail == p);
                for (int o = head; o < tail; o++) {
                    tag--;
                    if (s.charAt(o) == s.charAt(p)) {
                        head = o + 1;
//                        p=head-1;
                        System.out.println("tag为：" + tag + "li长度：" + li.size());
                        break;
                    }
                    li.remove(s.charAt(o));
                }
            }
            System.out.println("max此时为：" + max);
            if (tail == s.length() - 1) {
                System.out.println("到达末尾");
                if (tag == li.size()) {
                    max = Math.max(li.size(), max);
                    System.out.println("到达末尾，最长为:" + max);
                } else {
                    max = Math.max(li.size() - 1, max);
                }
                break;
            }
            tail++;
        }
        return max;
    }
}
